/*
 * Copyright 2013 Glassy Cinema.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package hu.glassy.core.service;

import hu.glassy.core.service.common.EntityService;
import hu.glassy.core.model.Account;
import hu.glassy.web.error.ActivationTokenException;
import hu.glassy.web.error.EmailSendingException;
import java.util.List;

/**
 * Felhasználói accounttal kapcsolatos szolgáltatások.
 *
 * @author molnar.alexander@sonrisa.hu
 */
public interface AccountService extends EntityService<Account>
{

  /**
   * Visszaadja a megadott felhasználónévhez és jelszóhoz tartozó accountot
   *
   * @param email
   *                          E-mail cím
   * @param encryptedPassword
   *                          Titkosított jelszó
   *
   * @return A megadott paraméterekhez tartozó {@link Account} objektumot, vagy
   * <strong>null</strong> értéket, ha nem található account a megadott
   * paraméterekkel.
   */
  public Account findByEmailAndPassword(String email, String encryptedPassword);

  /**
   * Visszaadja a paraméterben kapott ID-val rendelkező accountot
   *
   * @param id
   *           Account ID
   *
   * @return account, vagy null, ha nem látezik
   */
  public Account findById(Long id);

  /**
   * Ellenőrzi, hogy a kapott e-mail cimmel van-e regisztrált felhasználó a
   * rendszeben.
   *
   * @param email
   *              Az ellenőrizendő felhasználónév
   *
   * @return <ul>
   * <li><strong>true</strong>, ha már van regisztrált felhasználó a kapott
   * e-mail cimmel</li>
   * <li><strong>false</strong>, ha még nincs regisztrált felhasználó a kapott
   * e-mail cimmel<</li>
   * </ul>
   */
  public boolean isEmailInUse(String email);

  /**
   * Ellenőrzi, hogy a kapott e-mail címmel van-e regisztrált felhasználó a
   * rendszeben.
   *
   * @param email The user's email address
   *
   * @return <ul>
   * <li><strong>true</strong>, ha már van regisztrált felhasználó a kapott
   * e-mail címmel</li>
   * <li><strong>false</strong>, ha még nincs regisztrált felhasználó a kapott
   * e-mail címmel</li>
   * </ul>
   */
  public boolean isEmailAddressInUse(String email);

  /**
   * Beállítja az utolsó bejelentkezés idejét az aktuális időpontra.
   *
   * @param account
   *                Ezen az accounton hajtja végre a módosítást
   */
  public void updateLastLoginDate(Account account);

  /**
   * Elindítja a paraméterben kapott felhasználói fiók regisztrációját, és
   * szükség esetén kiküldi az aktivációs tokent.
   *
   * @param account
   *
   * @throws hu.glassy.web.error.ActivationTokenException
   */
  public void registration(Account account) throws ActivationTokenException;

  /**
   * A paraméterben kapott e-mail címhez tartozó fióknak beállít egy generált
   * jelszót, amit e-mailben kiküld a rendszer.
   *
   * @param email
   *              Erre a címre lesz kiküldve az új jelszó
   *
   * @throws EmailSendingException
   */
  public void resetPassword(String email) throws EmailSendingException;

  /**
   * Menti a paraméterül kapott {@link Account} objektumot.
   *
   * @param account
   *                Ezt az accountot menti
   *
   * @throws ActivationTokenException
   */
  public void updateAccount(Account account) throws ActivationTokenException;

  /**
   *
   * Aktiválja a felhasználó accountját.
   *
   * @param account
   *                Aktiválandó account
   * @param key
   *                Aktivációs kulcs
   *
   * @throws ActivationTokenException
   */
  public void activate(Account account, String key) throws ActivationTokenException;

  /**
   * Inaktiválja a felhasználó accountját. Nem küld ki aktivációs e-mailt.
   *
   * @param account
   *                Inaktiválandó account
   */
  public void inactivate(Account account);

  /**
   *
   * Új e-mailt küld ki generált aktivációs kulccsal. A régebben kiküldött
   * aktivációs kulcsok érvénytelenek lesznek.
   *
   * @param account
   *                Az az account, amelyre vonatkozóan aktivációs kulcsot kell kiküldeni
   *
   * @throws hu.glassy.web.error.ActivationTokenException
   */
  public void resendActivationKey(Account account) throws ActivationTokenException;

  /**
   * Indicates whether the submitted email addresses should be activated.
   *
   * @return
   */
  public boolean isEmailActivationRequired();

  /**
   * Visszaadja az aktív felhasználói fiókok számát
   *
   * @return
   */
  public Long countActiveAccounts();

  /**
   * Visszaadja az aktív accountokat
   *
   * @param start
   * @param size
   * @param asc
   * @param sortProperties
   *
   * @return
   */
  public List<Account> listActiveAccounts(long start, long size, boolean asc, String... sortProperties);
}
